from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill, Border, Alignment, Side
import os


class ExcelDriver:
    def __init__(self, path):
        self.target_path = path
        # 检查文件是否存在
        if os.path.exists(path):
            self.driver = load_workbook(path)
        else:
            self.driver = Workbook()
            # 创建默认工作表
            self.driver.active.title = "Sheet1"
        self.current_tag = self.driver.active  # 默认使用活动工作表

    def choose_target(self, tag_name):
        """选择工作表，如果不存在则创建"""
        if tag_name not in self.driver.sheetnames:
            self.current_tag = self.driver.create_sheet(tag_name)
        else:
            self.current_tag = self.driver[tag_name]
        return self  # 支持链式调用

    def create_to_head(self, head_list):
        """创建表头并设置样式"""
        if not self.current_tag:
            raise ValueError("请先选择工作表")

        self.current_tag.append(head_list)

        # 设置表头样式
        header_font = Font(bold=True, color='FFFFFF')  # 白色加粗
        header_fill = PatternFill(start_color='2E75B6', fill_type='solid')  # 深蓝色背景
        header_border = Border(bottom=Side(style='thick', color='000000'))  # 粗下边框
        header_align = Alignment(horizontal='center', vertical='center')  # 居中

        for cell in self.current_tag[1]:
            cell.font = header_font
            cell.fill = header_fill
            cell.border = header_border
            cell.alignment = header_align

        # 调整列宽
        for col in self.current_tag.columns:
            self.current_tag.column_dimensions[col[0].column_letter].width = 15

        return self  # 支持链式调用

    def clear(self, start, end=None):
        """清空指定行范围的数据"""
        if not self.current_tag:
            raise ValueError("请先选择工作表")
        print('进入clear')
        if end is None:
            print('end不存在')
            # 清空单行
            for cell in self.current_tag[start]:
                cell.value = None
        else:
            print('end存在')
            # 清空多行
            self.current_tag.delete_rows(start, end)

        return self  # 支持链式调用

    def save(self,path):
        """保存工作簿"""
        self.driver.save(path)
        return self  # 支持链式调用

    def get_sheet_names(self):
        """获取所有表名"""
        return self.driver.sheetnames

    def get_current_sheet(self):
        """获取当前工作表名称"""
        return self.current_tag.title
    def insert_once(self,data):
        self.current_tag.append(data)
        return self
    def insert(self,datas):
        for data in datas:
            self.current_tag.append(data)
    #查询数据
    def query(self, condition=None, header=True, first_row=2):
        """
        查询数据

        参数:
            condition: 筛选条件函数，接受一行数据作为参数，返回布尔值
            header: 是否包含表头，默认为True
            first_row: 开始查询的行号，默认为2（跳过表头）

        返回:
            查询结果列表
        """
        if not self.current_tag:
            raise ValueError("请先选择工作表")
        results = []

        # 如果需要表头，先添加表头
        if header and first_row > 1:
            header_row = [cell.value for cell in self.current_tag[1]]
            results.append(header_row)

        # 遍历行，应用筛选条件
        for row in self.current_tag.iter_rows(min_row=first_row, values_only=True):
            if condition is None or condition(row):
                results.append(row)
        return results
